home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cpp_libs
/
linklist
/
source.lha
/
sorted.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-08
|
8KB
|
271 lines
#include <stdio.h>
#include <string.h>
#include "list.h"
static void addPersonSorted(), addPerson();
static int fndNxtPerson(), sortPerson(), compare();
typedef struct person {
char lastname[15];
char firstname[15];
} Person, *PersonPtr;
int personSz = sizeof(Person);
main()
{
Person person;
int id, code;
/* ------- first solution --------------------------------------------------- */
fprintf(stdout, "..... Insert sorted by last name .....\n");
id = lDef(lSINGLY, lCHAIN);
addPersonSorted(id, "Ernie", "Makris");
addPersonSorted(id, "Anita", "Eijs");
addPersonSorted(id, "John", "Johnson");
addPersonSorted(id, "Bart", "Simpson");
addPersonSorted(id, "James", "Bond");
addPersonSorted(id, "Al", "Bundy");
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
code = lDel(id);
/* ------- second solution -------------------------------------------------- */
fprintf(stdout, "..... Insert unsorted .....\n");
id = lDef(lSINGLY, lCHAIN);
addPerson(id, "Ernie", "Makris");
addPerson(id, "Anita", "Eijs");
addPerson(id, "John", "Johnson");
addPerson(id, "Bart", "Simpson");
addPerson(id, "James", "Bond");
addPerson(id, "Al", "Bundy");
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name .....\n");
id = sortPerson(id);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
code = lDel(id);
/* ------- third solution --------------------------------------------------- */
fprintf(stdout, "..... Insert unsorted .....\n");
id = lDef(lSINGLY, lCHAIN);
addPerson(id, "Ernie", "Makris");
addPerson(id, "Anita", "Eijs");
addPerson(id, "John", "Johnson");
addPerson(id, "Bart", "Simpson");
addPerson(id, "James", "Bond");
addPerson(id, "Al", "Bundy");
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Bubble ASCENDING .....\n");
code = lSort(id, lASCENDING, lBUBBLE, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Bubble DESCENDING .....\n");
code = lSort(id, lDESCENDING, lBUBBLE, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Heap ASCENDING .....\n");
code = lSort(id, lASCENDING, lHEAP, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Heap DESCENDING .....\n");
code = lSort(id, lDESCENDING, lHEAP, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Insert ASCENDING .....\n");
code = lSort(id, lASCENDING, lINSERT, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Insert DESCENDING .....\n");
code = lSort(id, lDESCENDING, lINSERT, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Quick ASCENDING .....\n");
code = lSort(id, lASCENDING, lQUICK, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Quick DESCENDING .....\n");
code = lSort(id, lDESCENDING, lQUICK, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Selection ASCENDING .....\n");
code = lSort(id, lASCENDING, lSELECTION, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
fprintf(stdout, "..... Sort by last name ..... Selection DESCENDING .....\n");
code = lSort(id, lDESCENDING, lSELECTION, compare);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
fprintf(stdout, "%s, %s\n", person.lastname, person.firstname);
code = lGetNode(id, lNEXT, &person, personSz);
}
code = lDel(id);
}
static void
addPersonSorted(id, first, last)
int id;
char *first, *last;
{
Person person, new;
char tmp[15];
int code;
/* find next last name */
strcpy(&tmp[0], last);
code = lFndNode(id, lFIRST, fndNxtPerson, &tmp[0], &person, personSz);
strcpy(new.lastname, last);
strcpy(new.firstname, first);
/* insert data in alphabetical order */
if (code == lEMPTY_LIST || code == lFIRST)
code = lInsNode(id, lFIRST, &new, personSz, 0);
else if (code == lNOT_FOUND)
code = lInsNode(id, lLAST, &new, personSz, 0);
else
code = lInsNode(id, lBEFORE, &new, personSz, 0);
}
/* find next by specified last name before which specified name must be */
/* inserted (alphabetical order) */
static int
compare(p1, p2, order)
PersonPtr p1, p2;
int order;
{
int k = strcmp(p1->lastname, p2->lastname);
if (k == 0)
return(lSAME);
else if (k > 0)
return(l2LT1);
else if (k < 0)
return(l1LT2);
}
/* find next by specified last name before which specified name must be */
/* inserted (alphabetical order) */
static int
fndNxtPerson(last, data)
char *last;
PersonPtr data;
{
if (strcmp(last, data->lastname) < 0)
return(lFOUND);
else
return(lNOT_FOUND);
}
static void
addPerson(id, first, last)
int id;
char *first, *last;
{
Person new;
int code;
strcpy(new.lastname, last);
strcpy(new.firstname, first);
code = lInsNode(id, lLAST, &new, personSz, 0);
}
static int
sortPerson(id)
int id;
{
Person person, next;
char tmp[15];
int code, id2;
id2 = lDef(lSINGLY, lCHAIN);
code = lGetNode(id, lFIRST, &person, personSz);
while (code != lEOL && code != lEMPTY_LIST) {
/* find next last name */
strcpy(&tmp[0], person.lastname);
code = lFndNode(id2, lFIRST, fndNxtPerson, &tmp[0], &next,
personSz);
/* insert data in alphabetical order */
if (code == lEMPTY_LIST || code == lFIRST)
code = lInsNode(id2, lFIRST, &person, personSz, 0);
else if (code == lNOT_FOUND)
code = lInsNode(id2, lLAST, &person, personSz, 0);
else
code = lInsNode(id2, lBEFORE, &person, personSz, 0);
code = lGetNode(id, lNEXT, &person, personSz);
}
code = lDel(id);
return(id2);
}